from django.shortcuts import render

# Create your views here.
"""
需求: 获取省份信息
前端:
    当页面加载的时候，会发送axios请求，来获取省份信息
后端:
    请求: 不需要请求参数
    业务逻辑: 查询省份信息
    响应: JSON
    
    路由:     areas/
    步骤:
        1. 查询省份信息
        2. 返回响应
"""

from django.views import View
from apps.areas.models import Area
from django.http import JsonResponse
from django.core.cache import cache


class AreaView(View):
    def get(self, request):
        # 先查询缓存
        province_list = cache.get('province')
        # 如果缓存为空则查询数据库并设置缓存 否则世界返回
        if province_list is None:
            # 1.获取省份数据
            provinces = Area.objects.filter(parent=None)

            # 2.上面返回的是一个query对象 我们需要转换成JSON形式(键值对)(因为前端需要我们返回的是JSON数据)
            # 创建一个列表，将provinces中的对象全部转换成JSON形式然后添加进列表中
            province_list = []
            for province in provinces:
                province_list.append({'id': province.id, 'name': province.name})

            # 设置缓存
            cache.set('province', province_list, 3600 * 24)

        # 3.返回响应
        return JsonResponse({'code': 0, 'errmsg': 'ok', 'province_list': province_list})


"""
获取市区县的业务逻辑和上面获取省份的类似
前端:
    当页面加载的时候，会发送axios请求，来获取下一级的信息
后端:
    请求: 需要省份id(获取市),市的id(获取区县)
    业务逻辑: 根据id获取下一级的信息，将查询结果转换成字典列表
    响应: JSON
    
    路由:     areas/
    步骤:
        1. 查询省份id或者市id信息
        2. 将查询结果转换成字典列表
        3. 返回响应
"""


class SubAreaView(View):
    def get(self, request, id):
        # 获取缓存数据
        data_list = cache.get('city:%s' % id)

        if data_list is None:
            # 1. 查询省份id或者市id信息
            up_level = Area.objects.get(id=id)
            down_level = up_level.subs.all()
            # 2. 将查询结果转换成字典列表
            data_list = []
            for item in down_level:
                data_list.append({'id': item.id, 'name': item.name})

            # 设置缓存
            cache.set('city:%s' % id, data_list, 3600 * 24)

        # 3. 返回响应
        return JsonResponse({'code': 0, 'errmsg': 'ok', 'sub_data': {'subs': data_list}})


# 对于不经常变化的数据 我们最好缓存到redis中 减少数据库的查询
# 比如一些外卖平台，他的一些店铺基本不会出现前一个小时还在，后一个小时不在的现象 所以我们可以缓存到redis



